package com.ruoyi.framework;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * 数据库服务类
 * 提供与数据库交互的方法，供MQTT监听服务调用
 */
@Service
public class DatabaseService {

    private static final Logger logger = LoggerFactory.getLogger(DatabaseService.class);

    // 注入JdbcTemplate，用于执行SQL操作
    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     * 保存设备数据到数据库
     * @param message 设备数据消息
     */
    public void saveDeviceData(String message) {
        try {
            // 这里假设消息是JSON格式，可以解析出设备ID、数值等信息
            // 实际应用中应该根据具体的消息格式进行解析
            logger.info("正在保存设备数据到数据库: {}", message);
            
            // 示例SQL语句，实际应根据数据库表结构调整
            String sql = "INSERT INTO device_data (device_id, data_value, receive_time) VALUES (?, ?, ?)";
            
            // 这里只是示例，实际应用中需要解析message获取具体数据
            // 假设message格式为 "deviceId:value"
            String deviceId = "unknown";
            String dataValue = message;
            
            if (message.contains(":")) {
                String[] parts = message.split(":");
                if (parts.length >= 2) {
                    deviceId = parts[0];
                    dataValue = parts[1];
                }
            }
            
            // 执行SQL插入操作
            jdbcTemplate.update(sql, deviceId, dataValue, new Date());
            
            logger.info("设备数据保存成功");
        } catch (Exception e) {
            logger.error("保存设备数据到数据库失败: {}", e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 处理用户命令
     * @param message 用户命令消息
     */
    public void processUserCommand(String message) {
        try {
            // 这里假设消息是JSON格式，可以解析出用户ID、命令类型等信息
            // 实际应用中应该根据具体的消息格式进行解析
            logger.info("正在处理用户命令: {}", message);
            
            // 示例SQL语句，实际应根据数据库表结构调整
            String sql = "INSERT INTO user_command (user_id, command_type, command_content, execute_time) VALUES (?, ?, ?, ?)";
            
            // 这里只是示例，实际应用中需要解析message获取具体数据
            // 假设message格式为 "userId:commandType:content"
            String userId = "unknown";
            String commandType = "unknown";
            String content = message;
            
            if (message.contains(":")) {
                String[] parts = message.split(":");
                if (parts.length >= 3) {
                    userId = parts[0];
                    commandType = parts[1];
                    content = parts[2];
                } else if (parts.length >= 2) {
                    userId = parts[0];
                    commandType = parts[1];
                }
            }
            
            // 执行SQL插入操作
            jdbcTemplate.update(sql, userId, commandType, content, new Date());
            
            // 根据命令类型执行不同的业务逻辑
            executeCommandByType(commandType, content);
            
            logger.info("用户命令处理成功");
        } catch (Exception e) {
            logger.error("处理用户命令失败: {}", e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 根据命令类型执行具体的业务逻辑
     * @param commandType 命令类型
     * @param content 命令内容
     */
    private void executeCommandByType(String commandType, String content) {
        // 根据命令类型执行不同的业务逻辑
        switch (commandType.toLowerCase()) {
            case "update_status":
                // 执行更新状态的逻辑
                updateDeviceStatus(content);
                break;
            case "send_notification":
                // 执行发送通知的逻辑
                sendNotification(content);
                break;
            default:
                logger.warn("未知的命令类型: {}", commandType);
        }
    }

    /**
     * 更新设备状态
     * @param content 状态内容
     */
    private void updateDeviceStatus(String content) {
        // 实际应用中应该根据具体需求实现
        logger.info("更新设备状态: {}", content);
    }

    /**
     * 发送通知
     * @param content 通知内容
     */
    private void sendNotification(String content) {
        // 实际应用中应该根据具体需求实现
        logger.info("发送通知: {}", content);
    }

    /**
     * 保存系统通知到数据库
     * @param message 系统通知消息
     */
    public void saveSystemNotification(String message) {
        try {
            // 这里假设消息是JSON格式，可以解析出通知类型、内容等信息
            // 实际应用中应该根据具体的消息格式进行解析
            logger.info("正在保存系统通知到数据库: {}", message);
            
            // 示例SQL语句，实际应根据数据库表结构调整
            String sql = "INSERT INTO system_notification (notification_type, content, create_time, is_read) VALUES (?, ?, ?, ?)";
            
            // 这里只是示例，实际应用中需要解析message获取具体数据
            // 假设message格式为 "type:content"
            String notificationType = "system";
            String content = message;
            
            if (message.contains(":")) {
                String[] parts = message.split(":");
                if (parts.length >= 2) {
                    notificationType = parts[0];
                    content = parts[1];
                }
            }
            
            // 执行SQL插入操作
            jdbcTemplate.update(sql, notificationType, content, new Date(), 0);
            
            logger.info("系统通知保存成功");
        } catch (Exception e) {
            logger.error("保存系统通知到数据库失败: {}", e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 查询数据库中的设备数据
     * @param deviceId 设备ID
     * @return 查询结果
     */
    public String queryDeviceData(String deviceId) {
        try {
            // 示例SQL语句，实际应根据数据库表结构调整
            String sql = "SELECT data_value FROM device_data WHERE device_id = ? ORDER BY receive_time DESC LIMIT 1";
            
            // 执行SQL查询操作
            return jdbcTemplate.queryForObject(sql, new Object[]{deviceId}, String.class);
        } catch (Exception e) {
            logger.error("查询设备数据失败: {}", e.getMessage(), e);
            return null;
        }
    }
}